/**
 *	通过反射操作结构体
 */
package main

import (
	"fmt"
	"reflect"
)

type student struct {
	name string  
	age  int
}

func testRefl(a interface{}) {
	val := reflect.ValueOf(a)
	typ := reflect.TypeOf(a)
	kind := val.Kind()
	//Struct是reflect中的常量
	if kind != reflect.Struct {
		fmt.Print("不是结构体")
		return
	}

	//获取json
	json := typ.Field(0).Tag.Get("jsoon")
	fmt.Printf("=======%s", json)

	//获取结构体的字段数量 方法数量
	num1 := val.NumField()
	for i := 0; i < num1; i++ {
		//获取字段的名字  以及类型
		fmt.Printf("%d , %v", i, val.Field(i).Kind())
		//设置值 需要传入struct的地址
		//val.Field(i).SetString("coco")
	}
	num2 := val.NumMethod()
	fmt.Print(num1, num2)
	//使用结构体中的方法  这里没定义方法 会报错
	var args []reflect.Value
	val.Method(1).Call(args)

}

func main() {
	var stu student = student{
		name: "cici",
		age:  18,
	}
	testRefl(stu)
}
